Maps
Mapler
anahtar değer (key pair
) ikilisinden oluşan yapılardır. Hiçbir girdi aynı anahtara sahip olamaz Bir değere bakmak istediğimizde o değerin anahtarını da bilmemiz gerekmektedir.
Rust bizlere iki adet Map
vermektedir. Bunlar:
- Hash Map
- Binary Map (binary tree map)
olmaktadır.
Hash map
koleksiyonları heap
içerisinde ayrılmış bir tabloda oluşurken binary tree
değerleri yaprak ve köklerden oluşan düğümler bütününden oluşmaktadır. İki map'de birbirine benzer olmaktadır. Ancak anlatım kolaylığı açısından şu anlık burada hash map
üzerinde duracağız.
Hashmap değerini sistemimize eklerken ilk olarak hashmap
i main.rs
dosyamız içerisine entegre etmemiz gerekmektedir.
use std::colections::Hashmap;
Sonrasında artık kodumuz içerisinde mutable
bir hashmap oluşturabiliriz.
let mut hm = HashMap::new();
Binary heap için geçerli olduğu gibi burada da hashmap
'in boyutunu len
ve is_emtpy
methodları ile kontrol etmek mümkün olmaktadır.
Hadi hashmap
'imiz içerisine veri ekleyerek başlayalım!
hm.insert(1,1); // 1 anahtarına sahip 1 değeri
hm.insert(5,2); // 5 anahtarına sahip 2 değeri
hm.insert(30,3); // 30 anahtarına sahip 3 değeri
Oluştrurduğumuz hashmap
'i artık yazdırabiliriz.
println!("{:?}", hm); // {1:1, 5:2, 30:3}
Daha önceden her bir anahtarın birden fazla değere sahip olamayacağını bahsetmiştik, peki bu durumda iki kez üst üste tanımlamaya çalışırsak ne olacak? İkinci yazdığımız ilk değeri güncelleyerek eski değeri kendine eşitleyecektir.
hm.insert(30,3);
let eski = hm.insert(30,5);
println!("{:?}", hm); // {1:1, 5:2, 30:5}
println!("{:?}", eski); // Some(3)
Some olarak dönderilmesinin nedeni herhangi bir değişkenin yerinin değişmemesi halindeki none değeridir.
Bir anahtarın var olup olmadığını contains_key()
methodu ile kontrol edebiliriz. Bu sayede bir map içerisinde arama yapmış olabiliriz.
println!("{:?}", hm.contains_key(&5)); // True
println!("{:?}", hm.contains_key(&8)); // False
Peki bir key içerisinden nasıl veriyi çekebiliriz?
Bu işlemi yapmak için get
yapısını kullanmamız gerekmektedir.
println!("{:?}", hm.get(&5)); // Some(2)
Bu hashmap
içerisiden veri silmek için de birçok yöntemimiz vardır. Bunlardan ilki remove()
yapısını kullanmaktır. İçerisine çıkarmak istediğimiz verinin anahtarının referansını almaktadır.
hm.remove(&1);
println!("{:?}", hm); // {30:4, 5:2}
Bu işlem aynı zamanda pop
gibi içerisinden çıkarılan elemanı kendine eşitlemektedir. Bu nedenle direkt olarak bir değişkene eşitlenip kullanılabilir.
Bir diğer silme işlemi de remove_entry
olmaktadır. Bu işlem normal remove
yapısına kıyasla bir değişkene eşitlendiğinde hem değeri hemde anahtarı ifade etmektedir.
let remove = hm.remove_entry(&5); // Some(5,2)
Tüm listeyi silmek için clear
methodunu kullanabilir ve bu durumun kesinlikle gerçekleştiğini test etmek için is_empty()
yapısını kullanabiliriz.
hm.clear();
println!("{}", hm.is_empty()); // True